{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.14","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"gpu","dataSources":[{"sourceId":9407429,"sourceType":"datasetVersion","datasetId":5711874}],"dockerImageVersionId":30762,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import os\nimport glob\n\nimport mne\nimport numpy as np\nimport matplotlib.pyplot as plt\nfrom tqdm.auto import tqdm\nfrom sklearn.model_selection import train_test_split","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2024-11-04T14:22:46.877067Z","iopub.execute_input":"2024-11-04T14:22:46.877439Z","iopub.status.idle":"2024-11-04T14:22:48.930557Z","shell.execute_reply.started":"2024-11-04T14:22:46.877401Z","shell.execute_reply":"2024-11-04T14:22:48.929597Z"},"trusted":true},"execution_count":1,"outputs":[]},{"cell_type":"code","source":"data_dir = \"/kaggle/input/ppg-dalia-processed\"\nfilepaths = glob.glob(os.path.join(data_dir, \"*.npz\"))","metadata":{"execution":{"iopub.status.busy":"2024-11-04T14:22:58.417360Z","iopub.execute_input":"2024-11-04T14:22:58.417858Z","iopub.status.idle":"2024-11-04T14:22:58.425897Z","shell.execute_reply.started":"2024-11-04T14:22:58.417821Z","shell.execute_reply":"2024-11-04T14:22:58.424983Z"},"trusted":true},"execution_count":2,"outputs":[]},{"cell_type":"code","source":"# 80-20-20\ntrain_files, test_files = train_test_split(filepaths, test_size=0.2, shuffle=True, random_state=42)\nval_files, test_files = train_test_split(test_files, test_size=0.5, shuffle=True, random_state=42)","metadata":{"execution":{"iopub.status.busy":"2024-11-04T14:23:02.775819Z","iopub.execute_input":"2024-11-04T14:23:02.776207Z","iopub.status.idle":"2024-11-04T14:23:02.783908Z","shell.execute_reply.started":"2024-11-04T14:23:02.776170Z","shell.execute_reply":"2024-11-04T14:23:02.782913Z"},"trusted":true},"execution_count":3,"outputs":[]},{"cell_type":"code","source":"labels = []\n\nfor file in train_files:\n    labels.append(np.load(file)[\"label\"])\n    \nlabels = np.concatenate(labels)\nmean, std = labels.mean(), labels.std()","metadata":{"execution":{"iopub.status.busy":"2024-11-04T14:23:05.342295Z","iopub.execute_input":"2024-11-04T14:23:05.342710Z","iopub.status.idle":"2024-11-04T14:23:05.551312Z","shell.execute_reply.started":"2024-11-04T14:23:05.342672Z","shell.execute_reply":"2024-11-04T14:23:05.550493Z"},"trusted":true},"execution_count":4,"outputs":[]},{"cell_type":"markdown","source":"- Dataset & Dataloader\n- Training\n- Evaluation","metadata":{}},{"cell_type":"code","source":"train_ecg = []\ntrain_ppg = []\ntrain_labels = []\n\nfor file in tqdm(train_files):\n    data = np.load(file)\n    ecg = data[\"ecg\"]\n    ppg = data[\"ppg\"]\n    label = data[\"label\"]\n    \n    ecg_resampled = mne.filter.resample(ecg.astype(float), down=700/64)\n    train_ecg.append(ecg_resampled)\n    train_ppg.append(ppg)\n    train_labels.append(label)","metadata":{"execution":{"iopub.status.busy":"2024-11-04T14:23:09.192473Z","iopub.execute_input":"2024-11-04T14:23:09.192840Z","iopub.status.idle":"2024-11-04T14:23:23.991019Z","shell.execute_reply.started":"2024-11-04T14:23:09.192806Z","shell.execute_reply":"2024-11-04T14:23:23.990110Z"},"trusted":true},"execution_count":5,"outputs":[{"output_type":"display_data","data":{"text/plain":"  0%|          | 0/12 [00:00<?, ?it/s]","application/vnd.jupyter.widget-view+json":{"version_major":2,"version_minor":0,"model_id":"19d4b2ac8c134f938ebc69635cfa17cf"}},"metadata":{}}]},{"cell_type":"code","source":"val_ecg = []\nval_ppg = []\nval_labels = []\n\nfor file in tqdm(val_files):\n    data = np.load(file)\n    ecg = data[\"ecg\"]\n    ppg = data[\"ppg\"]\n    label = data[\"label\"]\n    \n    ecg_resampled = mne.filter.resample(ecg.astype(float), down=700/64)\n    val_ecg.append(ecg_resampled)\n    val_ppg.append(ppg)\n    val_labels.append(label)","metadata":{"execution":{"iopub.status.busy":"2024-11-04T14:23:28.792220Z","iopub.execute_input":"2024-11-04T14:23:28.792752Z","iopub.status.idle":"2024-11-04T14:23:29.920558Z","shell.execute_reply.started":"2024-11-04T14:23:28.792711Z","shell.execute_reply":"2024-11-04T14:23:29.919602Z"},"trusted":true},"execution_count":6,"outputs":[{"output_type":"display_data","data":{"text/plain":"  0%|          | 0/1 [00:00<?, ?it/s]","application/vnd.jupyter.widget-view+json":{"version_major":2,"version_minor":0,"model_id":"9616114f5ec74d549e99871804966ffa"}},"metadata":{}}]},{"cell_type":"code","source":"test_ecg = []\ntest_ppg = []\ntest_labels = []\n\nfor file in tqdm(test_files):\n    data = np.load(file)\n    ecg = data[\"ecg\"]\n    ppg = data[\"ppg\"]\n    label = data[\"label\"]\n    \n    ecg_resampled = mne.filter.resample(ecg.astype(float), down=700/64)\n    test_ecg.append(ecg_resampled)\n    test_ppg.append(ppg)\n    test_labels.append(label)","metadata":{"execution":{"iopub.status.busy":"2024-11-04T14:48:58.633511Z","iopub.execute_input":"2024-11-04T14:48:58.633895Z","iopub.status.idle":"2024-11-04T14:49:01.160242Z","shell.execute_reply.started":"2024-11-04T14:48:58.633859Z","shell.execute_reply":"2024-11-04T14:49:01.159292Z"},"trusted":true},"execution_count":44,"outputs":[{"output_type":"display_data","data":{"text/plain":"  0%|          | 0/2 [00:00<?, ?it/s]","application/vnd.jupyter.widget-view+json":{"version_major":2,"version_minor":0,"model_id":"fcc39b3691304fc4a24318301e155553"}},"metadata":{}}]},{"cell_type":"code","source":"train_ecg = np.concatenate(train_ecg, axis=0)\nval_ecg = np.concatenate(val_ecg, axis=0)\n\ntrain_ppg = np.concatenate(train_ppg, axis=0)\nval_ppg = np.concatenate(val_ppg, axis=0)\n\ntrain_labels = np.concatenate(train_labels, axis=0)\nval_labels = np.concatenate(val_labels, axis=0)","metadata":{"execution":{"iopub.status.busy":"2024-11-04T14:23:36.239800Z","iopub.execute_input":"2024-11-04T14:23:36.240156Z","iopub.status.idle":"2024-11-04T14:23:36.382518Z","shell.execute_reply.started":"2024-11-04T14:23:36.240123Z","shell.execute_reply":"2024-11-04T14:23:36.381429Z"},"trusted":true},"execution_count":7,"outputs":[]},{"cell_type":"code","source":"test_ecg = np.concatenate(test_ecg, axis=0)\ntest_ppg = np.concatenate(test_ppg, axis=0)\ntest_labels = np.concatenate(test_labels, axis=0)","metadata":{"execution":{"iopub.status.busy":"2024-11-04T14:49:44.808903Z","iopub.execute_input":"2024-11-04T14:49:44.809292Z","iopub.status.idle":"2024-11-04T14:49:44.835853Z","shell.execute_reply.started":"2024-11-04T14:49:44.809252Z","shell.execute_reply":"2024-11-04T14:49:44.835063Z"},"trusted":true},"execution_count":45,"outputs":[]},{"cell_type":"code","source":"train_ecg = (train_ecg - np.min(train_ecg)) / (np.max(train_ecg) - np.min(train_ecg))\ntrain_ppg = (train_ppg - np.min(train_ppg)) / (np.max(train_ppg) - np.min(train_ppg))\n\nval_ecg = (val_ecg - np.min(val_ecg)) / (np.max(val_ecg) - np.min(val_ecg))\nval_ppg = (val_ppg - np.min(val_ppg)) / (np.max(val_ppg) - np.min(val_ppg))","metadata":{"execution":{"iopub.status.busy":"2024-11-04T14:23:39.973190Z","iopub.execute_input":"2024-11-04T14:23:39.973835Z","iopub.status.idle":"2024-11-04T14:23:40.202311Z","shell.execute_reply.started":"2024-11-04T14:23:39.973793Z","shell.execute_reply":"2024-11-04T14:23:40.201351Z"},"trusted":true},"execution_count":8,"outputs":[]},{"cell_type":"code","source":"test_ecg = (test_ecg - np.min(test_ecg)) / (np.max(test_ecg) - np.min(test_ecg))\ntest_ppg = (test_ppg - np.min(test_ppg)) / (np.max(test_ppg) - np.min(test_ppg))","metadata":{"execution":{"iopub.status.busy":"2024-11-04T14:50:28.052636Z","iopub.execute_input":"2024-11-04T14:50:28.053054Z","iopub.status.idle":"2024-11-04T14:50:28.093404Z","shell.execute_reply.started":"2024-11-04T14:50:28.053009Z","shell.execute_reply":"2024-11-04T14:50:28.092565Z"},"trusted":true},"execution_count":46,"outputs":[]},{"cell_type":"code","source":"def normalize_labels(label):\n    return (label - mean) / std\n\ndef unnormalize_labels(label):\n    return std * label + mean\n\nmean, std = train_labels.mean(), train_labels.std()","metadata":{"execution":{"iopub.status.busy":"2024-11-04T14:24:02.835119Z","iopub.execute_input":"2024-11-04T14:24:02.835531Z","iopub.status.idle":"2024-11-04T14:24:02.841618Z","shell.execute_reply.started":"2024-11-04T14:24:02.835489Z","shell.execute_reply":"2024-11-04T14:24:02.840691Z"},"trusted":true},"execution_count":9,"outputs":[]},{"cell_type":"code","source":"import torch\nimport torch.nn as nn\nimport torch.optim as optim\nimport torch.nn.functional as F\n\nfrom torch.utils.data import TensorDataset, DataLoader","metadata":{"execution":{"iopub.status.busy":"2024-11-04T14:24:05.275410Z","iopub.execute_input":"2024-11-04T14:24:05.276056Z","iopub.status.idle":"2024-11-04T14:24:08.357774Z","shell.execute_reply.started":"2024-11-04T14:24:05.276014Z","shell.execute_reply":"2024-11-04T14:24:08.356775Z"},"trusted":true},"execution_count":10,"outputs":[]},{"cell_type":"code","source":"train_ecg = torch.tensor(train_ecg, dtype=torch.float32)\ntrain_ppg = torch.tensor(train_ppg, dtype=torch.float32)\ntrain_labels = torch.tensor(train_labels, dtype=torch.float32)","metadata":{"execution":{"iopub.status.busy":"2024-11-04T14:25:47.960223Z","iopub.execute_input":"2024-11-04T14:25:47.961081Z","iopub.status.idle":"2024-11-04T14:25:48.071312Z","shell.execute_reply.started":"2024-11-04T14:25:47.961038Z","shell.execute_reply":"2024-11-04T14:25:48.070305Z"},"trusted":true},"execution_count":11,"outputs":[]},{"cell_type":"code","source":"test_ecg = torch.tensor(test_ecg, dtype=torch.float32)\ntest_ppg = torch.tensor(test_ppg, dtype=torch.float32)\ntest_labels = torch.tensor(test_labels, dtype=torch.float32)","metadata":{"execution":{"iopub.status.busy":"2024-11-04T14:51:14.177393Z","iopub.execute_input":"2024-11-04T14:51:14.178097Z","iopub.status.idle":"2024-11-04T14:51:14.193575Z","shell.execute_reply.started":"2024-11-04T14:51:14.178046Z","shell.execute_reply":"2024-11-04T14:51:14.192640Z"},"trusted":true},"execution_count":47,"outputs":[]},{"cell_type":"code","source":"train_ecg = train_ecg.unsqueeze(dim=-2)\ntrain_ppg = train_ppg.unsqueeze(dim=-2)\ntrain_labels = train_labels.unsqueeze(dim=-1)","metadata":{"execution":{"iopub.status.busy":"2024-11-04T14:25:50.204835Z","iopub.execute_input":"2024-11-04T14:25:50.205475Z","iopub.status.idle":"2024-11-04T14:25:50.217992Z","shell.execute_reply.started":"2024-11-04T14:25:50.205432Z","shell.execute_reply":"2024-11-04T14:25:50.217060Z"},"trusted":true},"execution_count":12,"outputs":[]},{"cell_type":"code","source":"test_ecg = test_ecg.unsqueeze(dim=-2)\ntest_ppg = test_ppg.unsqueeze(dim=-2)\ntest_labels = test_labels.unsqueeze(dim=-1)","metadata":{"execution":{"iopub.status.busy":"2024-11-04T14:53:31.045194Z","iopub.execute_input":"2024-11-04T14:53:31.045606Z","iopub.status.idle":"2024-11-04T14:53:31.051073Z","shell.execute_reply.started":"2024-11-04T14:53:31.045569Z","shell.execute_reply":"2024-11-04T14:53:31.050147Z"},"trusted":true},"execution_count":54,"outputs":[]},{"cell_type":"code","source":"train_labels_normalized = normalize_labels(train_labels)","metadata":{"execution":{"iopub.status.busy":"2024-11-04T14:25:54.002292Z","iopub.execute_input":"2024-11-04T14:25:54.002714Z","iopub.status.idle":"2024-11-04T14:25:54.016782Z","shell.execute_reply.started":"2024-11-04T14:25:54.002674Z","shell.execute_reply":"2024-11-04T14:25:54.015811Z"},"trusted":true},"execution_count":13,"outputs":[]},{"cell_type":"code","source":"batch_size = 128\n\ntrain_dataset = TensorDataset(train_ecg, train_ppg, train_labels_normalized)\ntrain_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True)","metadata":{"execution":{"iopub.status.busy":"2024-11-04T14:48:06.481818Z","iopub.execute_input":"2024-11-04T14:48:06.482621Z","iopub.status.idle":"2024-11-04T14:48:06.487764Z","shell.execute_reply.started":"2024-11-04T14:48:06.482574Z","shell.execute_reply":"2024-11-04T14:48:06.486729Z"},"trusted":true},"execution_count":43,"outputs":[]},{"cell_type":"code","source":"class BasicBlock(nn.Module):\n    expansion = 1\n\n    def __init__(self, in_planes, planes, stride=1):\n        super(BasicBlock, self).__init__()\n        self.conv1 = nn.Conv1d(in_planes, planes, kernel_size=3, stride=stride, padding=1, bias=False)\n        self.bn1 = nn.BatchNorm1d(planes)\n        self.conv2 = nn.Conv1d(planes, planes, kernel_size=3, stride=1, padding=1, bias=False)\n        self.bn2 = nn.BatchNorm1d(planes)\n\n        self.shortcut = nn.Sequential()\n        if stride != 1 or in_planes != self.expansion*planes:\n            self.shortcut = nn.Sequential(\n                nn.Conv1d(in_planes, self.expansion*planes, kernel_size=1, stride=stride, bias=False),\n                nn.BatchNorm1d(self.expansion*planes)\n            )\n\n    def forward(self, x):\n        out = F.relu(self.bn1(self.conv1(x)))\n        out = self.bn2(self.conv2(out))\n        out += self.shortcut(x)\n        out = F.relu(out)\n        return out\n\n\n\nclass Bottleneck(nn.Module):\n    expansion = 4\n\n    def __init__(self, in_planes, planes, stride=1):\n        super(Bottleneck, self).__init__()\n        self.conv1 = nn.Conv1d(in_planes, planes, kernel_size=1, bias=False)\n        self.bn1 = nn.BatchNorm1d(planes)\n        self.conv2 = nn.Conv1d(planes, planes, kernel_size=3, stride=stride, padding=1, bias=False)\n        self.bn2 = nn.BatchNorm1d(planes)\n        self.conv3 = nn.Conv1d(planes, self.expansion*planes, kernel_size=1, bias=False)\n        self.bn3 = nn.BatchNorm1d(self.expansion*planes)\n\n        self.shortcut = nn.Sequential()\n        if stride != 1 or in_planes != self.expansion*planes:\n            self.shortcut = nn.Sequential(\n                nn.Conv1d(in_planes, self.expansion*planes, kernel_size=1, stride=stride, bias=False),\n                nn.BatchNorm1d(self.expansion*planes)\n            )\n\n    def forward(self, x):\n        out = F.relu(self.bn1(self.conv1(x)))\n        out = F.relu(self.bn2(self.conv2(out)))\n        out = self.bn3(self.conv3(out))\n        out += self.shortcut(x)\n        out = F.relu(out)\n        return out\n\n\nclass ResNet(nn.Module):\n    def __init__(self, block, num_blocks, num_classes=2):\n        super(ResNet, self).__init__()\n        self.in_planes = 48\n\n        self.conv0 = nn.Conv1d(1, 48, kernel_size=80, stride=4)\n        self.bn1 = nn.BatchNorm1d(48)\n        self.stage0 = self._make_layer(block, 48, num_blocks[0], stride=1)\n        self.stage1 = self._make_layer(block, 96, num_blocks[1], stride=2)\n        self.stage2 = self._make_layer(block, 192, num_blocks[2], stride=2)\n        self.stage3 = self._make_layer(block, 384, num_blocks[3], stride=2)\n        self.fc = nn.Linear(384*block.expansion, num_classes)\n\n\n    def _make_layer(self, block, planes, num_blocks, stride):\n        strides = [stride] + [1]*(num_blocks-1)\n        layers = []\n        for stride in strides:\n            layers.append(block(self.in_planes, planes, stride))\n            self.in_planes = planes * block.expansion\n        return nn.Sequential(*layers)\n\n\n    def forward(self, x):\n        \n        out = self.conv0(x)\n        out = self.bn1(out)\n        out = F.relu(out)\n        out = self.stage0(out)\n        out = self.stage1(out)\n        out = self.stage2(out)\n        out = self.stage3(out)\n        out = F.avg_pool1d(out, 1)\n        \n        features = out.mean(dim=2)\n        out = self.fc(features)\n        \n        return out, features\n\n\n\ndef ResNet18(num_classes=2):\n    return ResNet(BasicBlock, [2,2,2,2], num_classes=num_classes)\n\ndef ResNet34(num_classes=2):\n    return ResNet(BasicBlock, [3,4,6,3], num_classes=num_classes)\n\ndef ResNet50(num_classes=2):\n    return ResNet(Bottleneck, [3,4,6,3], num_classes=num_classes)\n\ndef ResNet101(num_classes=2):\n    return ResNet(Bottleneck, [3,4,23,3], num_classes=num_classes)\n\ndef ResNet152(num_classes=2):\n    return ResNet(Bottleneck, [3,8,36,3], num_classes=num_classes)","metadata":{"_kg_hide-input":true,"execution":{"iopub.status.busy":"2024-11-04T14:26:25.592251Z","iopub.execute_input":"2024-11-04T14:26:25.593120Z","iopub.status.idle":"2024-11-04T14:26:25.734285Z","shell.execute_reply.started":"2024-11-04T14:26:25.593077Z","shell.execute_reply":"2024-11-04T14:26:25.733318Z"},"trusted":true},"execution_count":15,"outputs":[]},{"cell_type":"code","source":"class ResBlock(nn.Module):\n\n    def __init__(self, filters, stage, i_block, kernel_size=3, stride=1):\n        super(ResBlock,self).__init__()\n        self.out_channels = filters\n        self.kernel_size = kernel_size\n        self.stride = stride\n        self.in_channels = filters\n\n        if i_block == 0 and stage != 0:\n            self.in_channels = filters // 2\n\n        self.conv1 = nn.Conv1d(\n            in_channels=self.in_channels,\n            out_channels=self.out_channels,\n            kernel_size=self.kernel_size,\n            stride=self.stride,\n            padding='same')\n        self.bn1 = nn.BatchNorm1d(self.out_channels)\n        self.relu1 = nn.ReLU()\n\n        self.conv2 = nn.Conv1d(\n            in_channels=self.out_channels,\n            out_channels=self.out_channels,\n            kernel_size=self.kernel_size,\n            stride=self.stride,\n            padding='same')\n\n        self.bn2 = nn.BatchNorm1d(self.out_channels)\n        self.bn3 = nn.BatchNorm1d(self.out_channels)\n        self.relu2 = nn.ReLU()\n\n    def forward(self, x):\n\n        out = x\n        out = self.relu1(self.bn1(self.conv1(out)))\n        out = self.bn2(self.conv2(out))\n        if x.shape[1] != out.shape[1]:\n            out = torch.add(out, torch.repeat_interleave(x, 2, dim=1))\n        else:\n            out = torch.add(out, x)\n\n        out = self.relu2(self.bn3(out))\n\n        return out\n\n\n\nclass Resnet34Baseline(nn.Module):\n    def __init__(self, num_classes=2):\n        super(Resnet34Baseline,self).__init__()\n        self.num_classes = num_classes\n        self.conv0 = nn.Conv1d(1, 48, 80, 4)\n        self.bn0 = nn.BatchNorm1d(48)\n        self.relu = nn.ReLU()\n        self.pool0 = nn.MaxPool1d(4)\n        self.stage0 = nn.Sequential(ResBlock(48, 0, 0),\n                                   ResBlock(48, 0, 1))\n        self.pool1 = nn.MaxPool1d(4)\n        self.stage1 = nn.Sequential(ResBlock(96, 1, 0),\n                                   ResBlock(96, 1, 1))\n        self.pool2 = nn.MaxPool1d(4)\n        self.stage2 = nn.Sequential(ResBlock(192, 2, 0),\n                                    ResBlock(192, 2, 1))\n        self.pool3 = nn.MaxPool1d(4)\n        self.stage3 = nn.Sequential(ResBlock(384, 3, 0),\n                                    ResBlock(384, 3, 1))\n\n        self.avgpool = nn.AvgPool1d(1)\n        self.dense1 = nn.Linear(384, self.num_classes)\n\n    def forward(self, x, placeholder):\n        \n        out = self.conv0(x)\n        out = self.bn0(out)\n        out = self.relu(out)\n        out = self.pool0(out)\n\n\n        out = self.stage0(out)\n        out = self.pool1(out)\n\n        out = self.stage1(out)\n        out = self.pool2(out)\n\n\n        out = self.stage2(out)\n        out = self.pool3(out)\n\n\n        out = self.stage3(out)\n\n\n        out = self.avgpool(out)\n        features = out.mean(dim=2)\n\n        out = self.dense1(features)\n\n        return features, out\n\n\nclass Resnet34(nn.Module):\n    def __init__(self, num_classes=2):\n        super(Resnet34,self).__init__()\n        self.num_classes = num_classes\n        self.conv0 = nn.Conv1d(1, 48, 7, 2)\n        self.bn0 = nn.BatchNorm1d(48)\n        self.relu = nn.ReLU()\n        self.pool0 = nn.MaxPool1d(2)\n        self.stage0 = nn.Sequential(ResBlock(48, 0, 0),\n                                   ResBlock(48, 0, 1))\n        self.pool1 = nn.MaxPool1d(2)\n        self.stage1 = nn.Sequential(ResBlock(96, 1, 0),\n                                   ResBlock(96, 1, 1))\n        self.pool2 = nn.MaxPool1d(2)\n        self.stage2 = nn.Sequential(ResBlock(192, 2, 0),\n                                    ResBlock(192, 2, 1))\n        self.pool3 = nn.MaxPool1d(2)\n        self.stage3 = nn.Sequential(ResBlock(384, 3, 0),\n                                    ResBlock(384, 3, 1))\n\n        self.avgpool = nn.AvgPool1d(1)\n        self.fc = nn.Linear(384, self.num_classes)\n\n    def forward(self, x):\n        \n        out = self.conv0(x)\n        out = self.bn0(out)\n        out = self.relu(out)\n        out = self.pool0(out)\n\n\n        out = self.stage0(out)\n        out = self.pool1(out)\n\n        out = self.stage1(out)\n        out = self.pool2(out)\n\n\n        out = self.stage2(out)\n        out = self.pool3(out)\n\n\n        out = self.stage3(out)\n\n\n        out = self.avgpool(out)\n        features = out.mean(dim=2)\n        out = self.fc(features)\n\n        return out, features\n\n\nclass DirectFwd(nn.Module):\n    def __init__(self):\n        super(DirectFwd, self).__init__()\n\n    def forward(self, x):\n        return x\n\n\nclass Res34SimSiam(nn.Module):\n    \"\"\"\n    Build a SimSiam model.\n    \"\"\"\n    def __init__(self, dim=2048, pred_dim=512, predictor=True):\n        \"\"\"\n        dim: feature dimension (default: 2048)\n        pred_dim: hidden dimension of the predictor (default: 512)\n        \"\"\"\n        super(Res34SimSiam, self).__init__()\n\n        # create the encoder\n        # num_classes is the output fc dimension, zero-initialize last BNs\n        self.encoder = Resnet34(num_classes=dim)\n        # build a 3-layer projector\n        prev_dim = self.encoder.fc.weight.shape[1]\n        self.encoder.fc = nn.Sequential(nn.Linear(prev_dim, prev_dim, bias=False),\n                                        nn.BatchNorm1d(prev_dim),\n                                        nn.ReLU(inplace=True), # first layer\n                                        nn.Linear(prev_dim, prev_dim, bias=False),\n                                        nn.BatchNorm1d(prev_dim),\n                                        nn.ReLU(inplace=True), # second layer\n                                        self.encoder.fc,\n                                        nn.BatchNorm1d(dim, affine=False)) # output layer\n        self.encoder.fc[6].bias.requires_grad = False # hack: not use bias as it is followed by BN\n\n        if predictor:\n        # build a 2-layer predictor\n            self.predictor = nn.Sequential(nn.Linear(dim, pred_dim, bias=False),\n                                            nn.BatchNorm1d(pred_dim),\n                                            nn.ReLU(inplace=True), # hidden layer\n                                            nn.Linear(pred_dim, dim)) # output layer\n        else:\n            self.predictor = DirectFwd()\n\n        self.regression_head = nn.Linear(384, 2)\n\n    def forward(self, ECG, PPG):\n        \"\"\"\n        Input:\n            x1: first views of images\n            x2: second views of images\n        Output:\n            p1, p2, z1, z2: predictors and targets of the network\n            See Sec. 3 of https://arxiv.org/abs/2011.10566 for detailed notations\n        \"\"\"\n        # compute features for one view\n        z1, features1 = self.encoder(ECG) # NxC\n        z2, features2 = self.encoder(PPG) # NxC\n\n        p1 = self.predictor(z1) # NxC\n        p2 = self.predictor(z2) # NxC\n\n        reg_pred1 = self.regression_head(features1)\n        reg_pred2 = self.regression_head(features2)\n\n        return p1, p2, z1.detach(), z2.detach(), reg_pred1, reg_pred2\n\n\nclass Res50SimSiam(nn.Module):\n    \"\"\"\n    Build a SimSiam model.\n    \"\"\"\n    def __init__(self, dim=2048, pred_dim=512, predictor=True, single_source_mode=False):\n        \"\"\"\n        dim: feature dimension (default: 2048)\n        pred_dim: hidden dimension of the predictor (default: 512)\n        \"\"\"\n        super(Res50SimSiam, self).__init__()\n\n        # create the encoder\n        # num_classes is the output fc dimension, zero-initialize last BNs\n        self.encoder = ResNet50(num_classes=dim)\n        self.single_source_mode = single_source_mode\n        # build a 3-layer projector\n        prev_dim = self.encoder.fc.weight.shape[1]\n\n        self.encoder.fc = nn.Sequential(nn.Linear(prev_dim, prev_dim, bias=False),\n                                        nn.BatchNorm1d(prev_dim),\n                                        nn.ReLU(inplace=True), # first layer\n                                        nn.Linear(prev_dim, prev_dim, bias=False),\n                                        nn.BatchNorm1d(prev_dim),\n                                        nn.ReLU(inplace=True), # second layer\n                                        self.encoder.fc,\n                                        nn.BatchNorm1d(dim, affine=False)) # output layer\n        self.encoder.fc[6].bias.requires_grad = False # hack: not use bias as it is followed by BN\n\n        if predictor:\n        # build a 2-layer predictor\n\n            self.predictor = nn.Sequential(nn.Linear(dim, pred_dim, bias=False),\n                                            nn.BatchNorm1d(pred_dim),\n                                            nn.ReLU(inplace=True), # hidden layer\n                                            nn.Linear(pred_dim, dim)) # output layer\n        else:\n            self.predictor = DirectFwd()\n\n        self.classification_head = nn.Linear(1536, 2)\n\n    def forward(self, ECG, PPG):\n        \"\"\"\n        Input:\n            x1: first views of images\n            x2: second views of images\n        Output:\n            p1, p2, z1, z2: predictors and targets of the network\n            See Sec. 3 of https://arxiv.org/abs/2011.10566 for detailed notations\n        \"\"\"\n\n        if not self.single_source_mode:\n            # compute features for one view\n            z1, features1 = self.encoder(ECG) # NxC\n            z2, features2 = self.encoder(PPG) # NxC\n\n            p1 = self.predictor(z1) # NxC\n            p2 = self.predictor(z2) # NxC\n            \n            class_pred1 = self.classification_head(features1)\n            class_pred2 = self.classification_head(features2)\n\n            return p1, p2, z1.detach(), z2.detach(), class_pred1, class_pred2\n        else:\n            z1, features1 = self.encoder(ECG) # NxC\n\n            p1 = self.predictor(z1) # NxC\n            \n            class_pred1 = self.classification_head(features1)\n\n            return p1, z1.detach(), class_pred1\n\n\n\nclass Resnet34Head(nn.Module):\n    def __init__(self):\n        super(Resnet34Head,self).__init__()\n        self.conv0 = nn.Conv1d(1, 48, 80, 4)\n        self.bn0 = nn.BatchNorm1d(48)\n        self.relu = nn.ReLU()\n        self.pool0 = nn.MaxPool1d(4)\n\n    def forward(self, x):\n        \n        out = self.conv0(x)\n        out = self.bn0(out)\n        out = self.relu(out)\n        out = self.pool0(out)\n        return out\n\n\nclass Resnet34Body(nn.Module):\n    def __init__(self, num_classes=2):\n        super(Resnet34Body,self).__init__()\n        self.num_classes = num_classes\n        self.stage0 = nn.Sequential(ResBlock(48, 0, 0),\n                                   ResBlock(48, 0, 1))\n        self.pool1 = nn.MaxPool1d(4)\n        self.stage1 = nn.Sequential(ResBlock(96, 1, 0),\n                                   ResBlock(96, 1, 1))\n        self.pool2 = nn.MaxPool1d(4)\n        self.stage2 = nn.Sequential(ResBlock(192, 2, 0),\n                                    ResBlock(192, 2, 1))\n        self.pool3 = nn.MaxPool1d(4)\n        self.stage3 = nn.Sequential(ResBlock(384, 3, 0),\n                                    ResBlock(384, 3, 1))\n\n        self.avgpool = nn.AvgPool1d(1)\n        self.fc = nn.Linear(384, self.num_classes)\n\n    def forward(self, x):\n        out = self.stage0(x)\n        out = self.pool1(out)\n\n        out = self.stage1(out)\n        out = self.pool2(out)\n\n        out = self.stage2(out)\n        out = self.pool3(out)\n\n        out = self.stage3(out)\n\n        out = self.avgpool(out)\n        features = out.mean(dim=2)\n        out = self.fc(features)\n\n        return out, features\n\n\nclass Res34SimSiamSplitHeads(nn.Module):\n    \"\"\"\n    Build a SimSiam model.\n    \"\"\"\n    def __init__(self, dim=2048, pred_dim=512, predictor=True, single_source_mode=False, single_source_head=''):\n        \"\"\"\n        dim: feature dimension (default: 2048)\n        pred_dim: hidden dimension of the predictor (default: 512)\n        \"\"\"\n        super(Res34SimSiamSplitHeads, self).__init__()\n\n        # create the encoder\n        # num_classes is the output fc dimension, zero-initialize last BNs\n\n        self.single_source_mode = single_source_mode\n        self.single_source_head = single_source_head\n\n        if self.single_source_mode and self.single_source_head not in ['PPG', 'ECG']:\n            raise Exception('single_source_head must be either ECG or PPG')\n\n        self.ECG_head = Resnet34Head()\n        self.PPG_head = Resnet34Head()\n        self.encoder = Resnet34Body(num_classes=dim)\n\n        # build a 3-layer projector\n        prev_dim = self.encoder.fc.weight.shape[1]\n        self.encoder.fc = nn.Sequential(nn.Linear(prev_dim, prev_dim, bias=False),\n                                        nn.BatchNorm1d(prev_dim),\n                                        nn.ReLU(inplace=True), # first layer\n                                        nn.Linear(prev_dim, prev_dim, bias=False),\n                                        nn.BatchNorm1d(prev_dim),\n                                        nn.ReLU(inplace=True), # second layer\n                                        self.encoder.fc,\n                                        nn.BatchNorm1d(dim, affine=False)) # output layer\n        self.encoder.fc[6].bias.requires_grad = False # hack: not use bias as it is followed by BN\n\n        if predictor:\n        # build a 2-layer predictor\n            self.predictor = nn.Sequential(nn.Linear(dim, pred_dim, bias=False),\n                                            nn.BatchNorm1d(pred_dim),\n                                            nn.ReLU(inplace=True), # hidden layer\n                                            nn.Linear(pred_dim, dim)) # output layer\n        else:\n            self.predictor = DirectFwd()\n\n        self.classification_head = nn.Linear(384, 2)\n\n    def forward(self, ECG, PPG):\n        \"\"\"\n        Input:\n            x1: first views of images\n            x2: second views of images\n        Output:\n            p1, p2, z1, z2: predictors and targets of the network\n            See Sec. 3 of https://arxiv.org/abs/2011.10566 for detailed notations\n        \"\"\"\n        if not self.single_source_mode:\n            ECG_aft_head = self.ECG_head(ECG)\n            PPG_aft_head = self.PPG_head(PPG)\n\n            # compute features for one view\n            z1, features1 = self.encoder(ECG_aft_head) # NxC\n            z2, features2 = self.encoder(PPG_aft_head) # NxC\n\n            p1 = self.predictor(z1) # NxC\n            p2 = self.predictor(z2) # NxC\n            \n            class_pred1 = self.classification_head(features1)\n            class_pred2 = self.classification_head(features2)\n\n            return p1, p2, z1.detach(), z2.detach(), class_pred1, class_pred2\n\n        elif self.single_source_mode and self.single_source_head == 'PPG':\n            PPG_aft_head = self.PPG_head(PPG)\n\n            # compute features for one view\n            z2, features2 = self.encoder(PPG_aft_head) # NxC\n\n            p2 = self.predictor(z2) # NxC\n            \n            class_pred2 = self.classification_head(features2)\n\n            return p2, z2.detach(), class_pred2\n\n        elif self.single_source_mode and self.single_source_head == 'ECG':\n            ECG_aft_head = self.ECG_head(ECG)\n\n            # compute features for one view\n            z1, features1 = self.encoder(ECG_aft_head) # NxC\n\n            p1 = self.predictor(z1) # NxC\n            \n            class_pred1 = self.classification_head(features1)\n\n            return p1, z1.detach(), class_pred1","metadata":{"_kg_hide-input":true,"execution":{"iopub.status.busy":"2024-11-04T14:29:02.122028Z","iopub.execute_input":"2024-11-04T14:29:02.122405Z","iopub.status.idle":"2024-11-04T14:29:02.185570Z","shell.execute_reply.started":"2024-11-04T14:29:02.122369Z","shell.execute_reply":"2024-11-04T14:29:02.184701Z"},"trusted":true},"execution_count":18,"outputs":[]},{"cell_type":"code","source":"device = \"cuda\" if torch.cuda.is_available() else \"cpu\"\n\nDIM1, DIM2 = 512, 128\nPREDICTOR = True","metadata":{"execution":{"iopub.status.busy":"2024-11-04T14:29:02.845123Z","iopub.execute_input":"2024-11-04T14:29:02.845849Z","iopub.status.idle":"2024-11-04T14:29:02.850145Z","shell.execute_reply.started":"2024-11-04T14:29:02.845810Z","shell.execute_reply":"2024-11-04T14:29:02.849253Z"},"trusted":true},"execution_count":19,"outputs":[]},{"cell_type":"code","source":"model = Res34SimSiam(DIM1, DIM2, predictor=PREDICTOR)\nmodel.to(device)\n\n# show model size\nmodel_size = 0\nfor param in model.parameters():\n    model_size += param.data.nelement()\nprint(\"Model params: %.2f M\" % (model_size / 1024 / 1024))","metadata":{"execution":{"iopub.status.busy":"2024-11-04T14:29:06.229808Z","iopub.execute_input":"2024-11-04T14:29:06.230479Z","iopub.status.idle":"2024-11-04T14:29:06.442521Z","shell.execute_reply.started":"2024-11-04T14:29:06.230433Z","shell.execute_reply":"2024-11-04T14:29:06.441577Z"},"trusted":true},"execution_count":20,"outputs":[{"name":"stdout","text":"Model params: 2.57 M\n","output_type":"stream"}]},{"cell_type":"code","source":"def cos_loss(p, z):\n    p = F.normalize(p, dim=1) # l2-normalize \n    z = F.normalize(z, dim=1) # l2-normalize \n    return -(p*z).sum(dim=1).mean()","metadata":{"execution":{"iopub.status.busy":"2024-11-04T14:29:10.081378Z","iopub.execute_input":"2024-11-04T14:29:10.082195Z","iopub.status.idle":"2024-11-04T14:29:10.087044Z","shell.execute_reply.started":"2024-11-04T14:29:10.082154Z","shell.execute_reply":"2024-11-04T14:29:10.085982Z"},"trusted":true},"execution_count":21,"outputs":[]},{"cell_type":"code","source":"PPG_LR = 1e-4\noptimizer = torch.optim.Adam(model.parameters(), lr=PPG_LR)","metadata":{"execution":{"iopub.status.busy":"2024-11-04T14:29:13.563074Z","iopub.execute_input":"2024-11-04T14:29:13.563736Z","iopub.status.idle":"2024-11-04T14:29:14.388677Z","shell.execute_reply.started":"2024-11-04T14:29:13.563693Z","shell.execute_reply":"2024-11-04T14:29:14.387689Z"},"trusted":true},"execution_count":22,"outputs":[]},{"cell_type":"code","source":"LAMBDA = 1.0\nEPOCHS = 30","metadata":{"execution":{"iopub.status.busy":"2024-11-04T14:29:27.332260Z","iopub.execute_input":"2024-11-04T14:29:27.333248Z","iopub.status.idle":"2024-11-04T14:29:27.337399Z","shell.execute_reply.started":"2024-11-04T14:29:27.333202Z","shell.execute_reply":"2024-11-04T14:29:27.336322Z"},"trusted":true},"execution_count":23,"outputs":[]},{"cell_type":"code","source":"class GaussianNLLLoss(nn.Module):\n    def __init__(self):\n        super(GaussianNLLLoss, self).__init__()\n\n    def forward(self, y_pred, y_true):\n        # Split y_pred into mean and log_sigma components\n        mean, log_sigma = y_pred[:, 0], y_pred[:, 1]\n        sigma = torch.exp(log_sigma)  # Convert log_sigma to sigma\n\n        # Negative Log Likelihood\n        nll = 0.5 * torch.log(2 * torch.pi * sigma ** 2) + ((y_true - mean) ** 2) / (2 * sigma ** 2)\n        return nll.mean()  # Mean over the batch\n\n# Usage:\n# y_pred is of shape (B, 2), where the first column is mean and the second is log_sigma\n# y_true is of shape (B,)\n\nnll_loss_fn = GaussianNLLLoss()","metadata":{"execution":{"iopub.status.busy":"2024-11-04T14:35:31.206624Z","iopub.execute_input":"2024-11-04T14:35:31.206974Z","iopub.status.idle":"2024-11-04T14:35:31.213649Z","shell.execute_reply.started":"2024-11-04T14:35:31.206941Z","shell.execute_reply":"2024-11-04T14:35:31.212715Z"},"trusted":true},"execution_count":36,"outputs":[]},{"cell_type":"code","source":"total_losses = []\nnll_losses = []\nsimsam_losses = []\n\nfor epoch in tqdm(range(EPOCHS)):\n    for batch in train_loader:\n        ecg, ppg, labels = batch\n\n        ecg = ecg.to(device)\n        ppg = ppg.to(device)\n        labels = labels.to(device)\n\n        p1, p2, z1, z2, ecg_reg, ppg_reg = model(ecg, ppg)\n        simsam_loss = cos_loss(p1, z2) / 2 + cos_loss(p2, z1) / 2\n        ecg_nll_loss = nll_loss_fn(ecg_reg, labels.squeeze(dim=-1))\n        ppg_nll_loss = nll_loss_fn(ppg_reg, labels.squeeze(dim=-1))\n\n        total_loss = simsam_loss * LAMBDA + ecg_nll_loss + ppg_nll_loss\n\n        optimizer.zero_grad()\n        total_loss.backward()\n        optimizer.step()\n\n        total_losses.append(total_loss.item())\n\n        nll_loss = ecg_nll_loss + ppg_nll_loss\n        nll_losses.append(nll_loss.item())\n\n        simsam_losses.append(simsam_loss.item())","metadata":{"execution":{"iopub.status.busy":"2024-11-04T14:35:38.053922Z","iopub.execute_input":"2024-11-04T14:35:38.054781Z","iopub.status.idle":"2024-11-04T14:44:57.707186Z","shell.execute_reply.started":"2024-11-04T14:35:38.054740Z","shell.execute_reply":"2024-11-04T14:44:57.706292Z"},"trusted":true},"execution_count":37,"outputs":[{"output_type":"display_data","data":{"text/plain":"  0%|          | 0/30 [00:00<?, ?it/s]","application/vnd.jupyter.widget-view+json":{"version_major":2,"version_minor":0,"model_id":"0163a2395c494500a4dea61235e5b72d"}},"metadata":{}}]},{"cell_type":"code","source":"plt.subplot(3, 1, 1)\nplt.plot(total_losses)\nplt.title(\"Joint Loss\")\n\nplt.subplot(3, 1, 2)\nplt.plot(nll_losses)\nplt.title(\"NLL Loss\")\n\nplt.subplot(3, 1, 3)\nplt.plot(simsam_losses)\nplt.title(\"Agreement Loss\")\n\nplt.tight_layout()\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2024-11-04T14:45:19.923221Z","iopub.execute_input":"2024-11-04T14:45:19.924105Z","iopub.status.idle":"2024-11-04T14:45:20.445774Z","shell.execute_reply.started":"2024-11-04T14:45:19.924062Z","shell.execute_reply":"2024-11-04T14:45:20.444785Z"},"trusted":true},"execution_count":39,"outputs":[{"output_type":"display_data","data":{"text/plain":"<Figure size 640x480 with 3 Axes>","image/png":"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"},"metadata":{}}]},{"cell_type":"code","source":"_ = model.eval()","metadata":{"execution":{"iopub.status.busy":"2024-11-04T14:46:09.986759Z","iopub.execute_input":"2024-11-04T14:46:09.987514Z","iopub.status.idle":"2024-11-04T14:46:09.992074Z","shell.execute_reply.started":"2024-11-04T14:46:09.987476Z","shell.execute_reply":"2024-11-04T14:46:09.991127Z"},"trusted":true},"execution_count":41,"outputs":[]},{"cell_type":"code","source":"with torch.no_grad():\n    _, _, _, _, ecg_reg, ppg_reg = model(test_ecg.to(device), test_ppg.to(device))","metadata":{"execution":{"iopub.status.busy":"2024-11-04T14:54:16.664579Z","iopub.execute_input":"2024-11-04T14:54:16.664968Z","iopub.status.idle":"2024-11-04T14:54:16.703873Z","shell.execute_reply.started":"2024-11-04T14:54:16.664931Z","shell.execute_reply":"2024-11-04T14:54:16.702891Z"},"trusted":true},"execution_count":57,"outputs":[]},{"cell_type":"code","source":"torch.abs(unnormalize_labels(ppg_reg[:, 0].cpu()) - test_labels[:, 0]).mean()","metadata":{"execution":{"iopub.status.busy":"2024-11-04T14:55:38.831324Z","iopub.execute_input":"2024-11-04T14:55:38.832167Z","iopub.status.idle":"2024-11-04T14:55:38.840464Z","shell.execute_reply.started":"2024-11-04T14:55:38.832126Z","shell.execute_reply":"2024-11-04T14:55:38.839570Z"},"trusted":true},"execution_count":68,"outputs":[{"execution_count":68,"output_type":"execute_result","data":{"text/plain":"tensor(21.1856)"},"metadata":{}}]},{"cell_type":"code","source":"torch.abs(unnormalize_labels(ecg_reg[:, 0].cpu()) - test_labels[:, 0]).mean()","metadata":{"execution":{"iopub.status.busy":"2024-11-04T14:55:49.235571Z","iopub.execute_input":"2024-11-04T14:55:49.236168Z","iopub.status.idle":"2024-11-04T14:55:49.244263Z","shell.execute_reply.started":"2024-11-04T14:55:49.236129Z","shell.execute_reply":"2024-11-04T14:55:49.243331Z"},"trusted":true},"execution_count":69,"outputs":[{"execution_count":69,"output_type":"execute_result","data":{"text/plain":"tensor(3.6625)"},"metadata":{}}]}]}